Apache Commons IO লাইব্রেরি ফাইল এবং ডিরেক্টরি সম্পর্কিত কাজ সহজ এবং কার্যকরী করার জন্য অনেক শক্তিশালী ক্লাস সরবরাহ করে। এর মধ্যে দুটি গুরুত্বপূর্ণ কার্যাবলী হলো Filename Normalization এবং Path Matching। এগুলি ফাইল সিস্টেমে পাথের সঠিক এবং সামঞ্জস্যপূর্ণ ব্যবস্থাপনা নিশ্চিত করতে সহায়ক।
১. Filename Normalization
ফাইল নামের Normalization হল একটি প্রক্রিয়া যা ফাইল পাথের ফরম্যাটকে একটি নির্দিষ্ট স্ট্যান্ডার্ডে নিয়ে আসে। এটি বিভিন্ন ফাইল সিস্টেমের মধ্যে পার্থক্য (যেমন, Windows এবং Unix পাথের মধ্যে) দূর করে এবং relative paths এবং absolute paths এর মধ্যে সামঞ্জস্য নিশ্চিত করে।
Filename Normalization এর প্রয়োজনীয়তা:
- Multiple directory separators: বিভিন্ন অপারেটিং সিস্টেমে ডিরেক্টরি সেপারেটর আলাদা হতে পারে (যেমন, "/" Unix/MacOS এ এবং "" Windows এ)। ফাইল নামের Normalization এই পার্থক্যগুলো দূর করে।
- Redundant or relative paths: যেমন, "../" বা "./" এর ব্যবহারকে নির্দিষ্ট ফরম্যাটে রূপান্তর করা।
FilenameUtils.normalize() মেথড
FilenameUtils.normalize() মেথডটি ফাইল পাথকে নরমালাইজ করে, যেখানে relative paths, parent directories, এবং directory separators সঠিকভাবে সামঞ্জস্য করা হয়।
উদাহরণ: Filename Normalization
import org.apache.commons.io.FilenameUtils;
public class FilenameNormalizationExample {
public static void main(String[] args) {
String filePath = "C:\\Users\\John\\Documents\\..\\Desktop\\file.txt";
// Filename normalization
String normalizedPath = FilenameUtils.normalize(filePath);
System.out.println("Normalized Path: " + normalizedPath);
}
}
এখানে:
- FilenameUtils.normalize() ব্যবহার করা হয়েছে যাতে ডিরেক্টরি পার্থক্য (যেমন, "..\") সঠিকভাবে সমাধান হয়ে যায় এবং সঠিক ফাইল পাথ তৈরি হয়।
আউটপুট:
Normalized Path: C:\Users\John\Desktop\file.txt
এটি দেখায় কিভাবে normalize() মেথড "..\" এর মতো অবাঞ্ছিত অংশগুলো সরিয়ে সঠিক পাথ প্রদান করে।
২. Path Matching
Path Matching হল একটি প্রক্রিয়া যেখানে পাথের সাথে মেলানো বা তুলনা করা হয়, বিশেষত wildcards এর মাধ্যমে। এটি প্রধানত ফাইল সিস্টেমের মধ্যে ডিরেক্টরি বা ফাইল খুঁজতে বা ফিল্টার করতে ব্যবহৃত হয়।
Apache Commons IO Path Matching এর জন্য FilenameUtils ক্লাসের মধ্যে বিভিন্ন ইউটিলিটি মেথড সরবরাহ করে, যেমন wildcard matching এবং পাথের তুলনা।
FilenameUtils.wildcardMatch() এবং FilenameUtils.wildcardMatchOnSystem()
- wildcardMatch(): এটি একটি পাথকে একটি wildcard প্যাটার্নের সাথে মেলানোর জন্য ব্যবহৃত হয়। উদাহরণস্বরূপ, আপনি "*.txt" প্যাটার্নের মাধ্যমে সমস্ত .txt ফাইল খুঁজে পেতে পারেন।
- wildcardMatchOnSystem(): এটি একই কাজ করে, তবে সিস্টেম নির্ভর ডিরেক্টরি সেপারেটর ব্যবহার করে (অর্থাৎ, Windows এবং Unix এর মধ্যে পার্থক্য বোঝে)।
wildcardMatch() উদাহরণ: Path Matching Using Wildcards
import org.apache.commons.io.FilenameUtils;
public class PathMatchingExample {
public static void main(String[] args) {
String filePath = "C:\\Users\\John\\Documents\\file.txt";
// Wildcard matching to check if the file path ends with .txt
boolean isMatch = FilenameUtils.wildcardMatch(filePath, "*.txt");
System.out.println("Does the file match the pattern? " + isMatch); // Output: true
}
}
এখানে:
- FilenameUtils.wildcardMatch() মেথডটি ব্যবহার করা হয়েছে "*.txt" প্যাটার্নের মাধ্যমে ফাইলটির এক্সটেনশন মেলাতে।
আউটপুট:
Does the file match the pattern? true
wildcardMatchOnSystem() উদাহরণ: Path Matching with System-specific Separator
import org.apache.commons.io.FilenameUtils;
public class PathMatchingSystemExample {
public static void main(String[] args) {
String filePath = "C:/Users/John/Documents/file.txt";
// Matching using system-specific separator
boolean isMatch = FilenameUtils.wildcardMatchOnSystem(filePath, "*/*/*/file.txt");
System.out.println("Does the file match the pattern? " + isMatch); // Output: true
}
}
এখানে:
- FilenameUtils.wildcardMatchOnSystem() ব্যবহার করা হয়েছে যেখানে সিস্টেমের ডিরেক্টরি সেপারেটর (এখানে /, যা Unix এর জন্য) স্বয়ংক্রিয়ভাবে ব্যবহৃত হচ্ছে।
আউটপুট:
Does the file match the pattern? true
৩. Path Matching with Directory Walker
এছাড়া, DirectoryWalker ক্লাসও path matching এর জন্য ব্যবহৃত হতে পারে, যেখানে আপনি একটি ডিরেক্টরি এবং তার অন্তর্গত ফাইলগুলো রিকার্সিভভাবে সার্চ করতে পারেন এবং সেগুলোকে একটি wildcard প্যাটার্নের সাথে তুলনা করতে পারেন।
DirectoryWalker উদাহরণ: Wildcard Matching with Directory Traversing
import org.apache.commons.io.DirectoryWalker;
import org.apache.commons.io.filefilter.WildcardFileFilter;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class DirectoryWalkerExample extends DirectoryWalker {
public static void main(String[] args) throws IOException {
File directory = new File("path/to/directory");
// Using DirectoryWalker to traverse the directory and match files with a wildcard
DirectoryWalker walker = new DirectoryWalker() {
@Override
protected boolean handleFile(File file, int depth, List<File> results) {
if (file.getName().endsWith(".txt")) {
System.out.println("Found .txt file: " + file.getName());
}
return true;
}
};
walker.walk(directory, null);
}
}
এখানে:
- DirectoryWalker ব্যবহার করা হয়েছে যাতে ডিরেক্টরি এবং তার সাবডিরেক্টরির মধ্যে wildcard matching করা যায়।
সারাংশ
Apache Commons IO লাইব্রেরির Filename Normalization এবং Path Matching ফিচারগুলো ফাইল সিস্টেমে পাথের ব্যবস্থাপনা সহজ এবং কার্যকরী করে তোলে। FilenameUtils.normalize() মেথডটি ফাইল পাথ নরমালাইজ করে, যা ডিরেক্টরি সেপারেটর এবং relative/absolute paths এর মধ্যে পার্থক্য দূর করে। wildcardMatch() এবং wildcardMatchOnSystem() মেথডগুলি পাথের সাথে মেলানো এবং wildcard matching এর জন্য ব্যবহৃত হয়। এগুলি ফাইল এবং ডিরেক্টরি সিস্টেমে কাজ করার সময় ডেভেলপারদের জন্য পারফেক্ট টুল।